package com.droid.persistor.mapper;

import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;

import com.droid.persistor.dao.Gasto;
import com.droid.persistor.dao.Usuario;
import com.droid.persistor.jdbc.DatabaseConnection;

public class UsuarioMapper extends DatabaseConnection {

	public Usuario getUsuario(String email) {
		Connection conn = getConnection();
		String sql = "SELECT idusuario,nombre,apellido,email,estado,password FROM USUARIOS WHERE EMAIL= "
				+ "'" + email + "'";
		Usuario usu = new Usuario();
		try {
			rs = getResultSet(conn, sql);
			if (rs.next()) {
				usu.setIdUsuario(rs.getInt("idusuario"));
				usu.setNombre(rs.getString("nombre"));
				usu.setApellido(rs.getString("apellido"));
				usu.setEmail(rs.getString("email"));
				usu.setEstado(rs.getString("estado"));
				usu.setPassword(rs.getString("password"));
				return usu;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}

		return null;

	}

	public void updateUsuarioApellido(Usuario usu) {
		Connection conn = getConnection();
		String sql = "UPDATE USUARIOS SET APELLIDO= '" + usu.getApellido()
				+ "' WHERE ID= '" + usu.getIdUsuario();
		try {
			execute(conn, sql);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}
	}

	public void updateUsuarioNombre(Usuario usu) {
		Connection conn = getConnection();
		String sql = "UPDATE USUARIOS SET NOMBRE= '" + usu.getNombre()
				+ "' WHERE ID= '" + usu.getIdUsuario();

		try {
			execute(conn, sql);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}
	}

	public void updateUsuarioEstado(Usuario usu) {
		Connection conn = getConnection();
		String sql = "UPDATE USUARIOS SET ESTADO= '" + usu.getEstado()
				+ "' WHERE IDUSUARIO= " + usu.getIdUsuario();

		try {
			execute(conn, sql);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}
	}

	public void updateUsuarioPassword(Usuario usu) {
		Connection conn = getConnection();
		String sql = "UPDATE USUARIOS SET PASSWORD= '" + usu.getPassword()
				+ "' WHERE IDUSUARIO= " + usu.getIdUsuario();

		try {
			execute(conn, sql);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}
	}

	public void updateUsuarioEmail(Usuario usu) {
		Connection conn = getConnection();
		String sql = "UPDATE USUARIOS SET EMAIL= '" + usu.getEmail()
				+ "' WHERE ID= '" + usu.getIdUsuario();

		try {
			execute(conn, sql);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}
	}

	public void altaUsuario(Usuario usu) {

		Connection conn = getConnection();
		CallableStatement cs;
		try {
			cs = conn.prepareCall("{call DROID.CREATE_USER(?,?,?,?)}");

			cs.setString(1, usu.getNombre());
			cs.setString(2, usu.getApellido());
			cs.setString(3, usu.getEmail());
			cs.setString(4, usu.getPassword());
			cs.executeUpdate();
			cs.close();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}

	public ArrayList<Gasto> getUsuarioGastos(String email) {
		Number idUser;
		Usuario usu;

		try {
			Connection conn = getConnection();

			usu = getUsuario(email);
			idUser = usu.getIdUsuario();
			ArrayList<Gasto> gastos = new ArrayList();

			String sql = "SELECT t.nombre,g.idgasto,idusuario,t.idtgasto,to_char(fecha,'dd/mm/yyyy HH24:MI:SS') fecha,c.idcategoria categoria,monto,g.PERIORICIDAD "
					+ "FROM GASTOS g, CATEGORIAS c,TIPO_DE_GASTOS t WHERE g.tipo_gasto=t.idtgasto "
					+ "AND g.categoria=c.idcategoria "
					+ "AND idusuario=  " + idUser + " order by idgasto desc ";

			rs = getResultSet(conn, sql);

			if (rs != null) {
				while (rs.next()) {
					Gasto gto = new Gasto();
					gto.setTipo_Gasto(rs.getInt("idtgasto"));
					gto.setFecha(rs.getString("fecha"));
					gto.setCategoria(rs.getInt("categoria"));
					gto.setMonto(rs.getString("monto"));
					gto.setIdgasto(rs.getInt("idgasto"));
					gto.setIdUsuario(rs.getInt("idusuario"));
					gto.setPerioricidad(rs.getString("perioricidad"));
					gto.setNombre(rs.getString("nombre"));
					gastos.add(gto);
				}
				rs.close();
				int count = gastos.size();
				return gastos;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}

		return null;

	}

	public ArrayList<Gasto> getUsuarioGastosVencidos(String email,String consulta) {
		Number idUser;
		Usuario usu;

		Connection conn = getConnection();

		usu = getUsuario(email);
		idUser = usu.getIdUsuario();
		ArrayList<Gasto> gastos = new ArrayList();

		CallableStatement cs;

		try {
		cs = conn.prepareCall("begin ? := PCK_SHEDULER.GET_GASTOS_VENCIDOS(?,?); end;");
		cs.registerOutParameter(1, OracleTypes.CURSOR);
		cs.setInt(2, (Integer) idUser);
		cs.setString(3, (String) consulta);
		cs.execute();
		ResultSet rs = (ResultSet) cs.getObject(1);
		if (rs != null) {
			while (rs.next()) {
				Gasto gto = new Gasto();
				gto.setTipo_Gasto(rs.getInt("tipo_gasto"));
				gto.setFecha(rs.getString("fecha"));
				gto.setCategoria(rs.getInt("categoria"));
				gto.setMonto(rs.getString("monto"));
				gastos.add(gto);
			}
			rs.close();
			int count = gastos.size();
			return gastos;
		}
		} catch (SQLException e) {

			e.printStackTrace();
		} finally {
			closeStatement();
		}
		return null;

	}

	public String getPasswordUsuario(String email) {
		Connection conn = getConnection();
		String sql = "SELECT password FROM USUARIOS WHERE EMAIL= " + "'"
				+ email + "'";
		Usuario usu = new Usuario();
		try {
			rs = getResultSet(conn, sql);

			if (rs != null) {
				while (rs.next()) {
					return rs.getString("password");
				}
				rs.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeStatement();
		}

		return null;
	}

}
